From 24a395f2db74c95e7e369f9ca8b2ca3db7b76d15 Mon Sep 17 00:00:00 2001 From: tsteven4 <13596209+tsteven4@users.noreply.github.com> Date: Tue, 23 Aug 2022 12:36:22 -0600 Subject: [PATCH] fix GUI handling of track filter start/stop times. This resolves #915 The timeSpec of the QDateTimeEdit objects is maintained in accordance with the TZCheck QCheckBox. This solves additional issues with DST transitions and edits. --- gui/filterdata.cc | 13 ++++--------- gui/filterdata.h | 2 +- gui/filterwidgets.cc | 42 +++++++++++++++++++++++++++++++++++++++++- gui/filterwidgets.h | 26 +++++++++++++++++++------- 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/gui/filterdata.cc b/gui/filterdata.cc index f0ff55f9b..0003c83ce 100644 --- a/gui/filterdata.cc +++ b/gui/filterdata.cc @@ -55,14 +55,9 @@ QStringList WayPtsFilterData::makeOptionString() } //------------------------------------------------------------------------ -static QString optionDate(const QDateTime& dt, bool useLocal) +static QString optionDate(const QDateTime& dt) { - QDateTime d; - if (useLocal) { - d = dt.toLocalTime(); - } else { - d = dt.toUTC(); - } + QDateTime d = dt.toUTC(); QDate date = d.date(); QTime time = d.time(); @@ -130,10 +125,10 @@ QStringList TrackFilterData::makeOptionString() } if (start) { - s += QString(",start=%1").arg(optionDate(startTime, TZ)); + s += QString(",start=%1").arg(optionDate(startTime)); } if (stop) { - s += QString(",stop=%1").arg(optionDate(stopTime, TZ)); + s += QString(",stop=%1").arg(optionDate(stopTime)); } if (move) { s += QString(",move=%1w%2d%3h%4m%5s").arg(weeks).arg(days).arg(hours).arg(mins).arg(secs); diff --git a/gui/filterdata.h b/gui/filterdata.h index 730187347..00071541d 100644 --- a/gui/filterdata.h +++ b/gui/filterdata.h @@ -61,7 +61,7 @@ class TrackFilterData: public FilterData public: TrackFilterData(): title(false), titleString(QString()), move(false), weeks(0), days(0), hours(0), mins(0), secs(0), - TZ(false), + TZ(true), start(false), stop(false), pack(false), merge(false), split(false), diff --git a/gui/filterwidgets.cc b/gui/filterwidgets.cc index a71ab88b4..d6d5aa17b 100644 --- a/gui/filterwidgets.cc +++ b/gui/filterwidgets.cc @@ -21,7 +21,16 @@ // #include "filterwidgets.h" -#include + +#include // for assert +#include // for numeric_limits + +#include // for QChar +#include // for QCheckBox +#include // for QEvent, QEvent::LocaleChange +#include // for QLabel +#include // for QRadioButton +#include // for LocalTime, UTC //------------------------------------------------------------------------ @@ -60,9 +69,24 @@ TrackWidget::TrackWidget(QWidget* parent, TrackFilterData& tfd): FilterWidget(pa connect(ui.splitTimeCheck, &QAbstractButton::clicked, this, &TrackWidget::splitTimeX); connect(ui.splitDistanceCheck, &QAbstractButton::clicked, this, &TrackWidget::splitDistanceX); + connect(ui.TZCheck, &QAbstractButton::clicked, this, &TrackWidget::TZX); + ui.startEdit->setDisplayFormat("dd MMM yyyy hh:mm:ss AP"); ui.stopEdit->setDisplayFormat("dd MMM yyyy hh:mm:ss AP"); + assert(tfd.startTime.timeSpec() == tfd.stopTime.timeSpec()); + assert((tfd.startTime.timeSpec() == Qt::UTC) || (tfd.startTime.timeSpec() == Qt::LocalTime)); + // Qt5 QDateTimeEdit::setDateTime ignored the passed QDateTime::timeSpec. + // Qt6 QDateTimeEdit::setDateTime will convert the passed QDateTime if the passed + // QDateTime::timeSpec doesn't match QDateTimeEdit::timeSpec. + // If the two timeSpecs match Qt5 and Qt6 behave the same. + ui.startEdit->setTimeSpec(tfd.startTime.timeSpec()); + ui.stopEdit->setTimeSpec(tfd.stopTime.timeSpec()); + // Force TZ data to be in sync with startTime & stopTime time spec. + // This makes sure the initial state of the TZCheck box is in agreement + // with the startTime::timeSpec and stopTime::timeSpec. + tfd.TZ = tfd.startTime.timeSpec() == Qt::LocalTime; + // Collect the data fields. fopts << new BoolFilterOption(tfd.title, ui.titleCheck); fopts << new BoolFilterOption(tfd.move, ui.moveCheck); @@ -157,6 +181,22 @@ void TrackWidget::splitDistanceX() } otherCheckX(); } +//------------------------------------------------------------------------ +void TrackWidget::TZX() +{ + if (ui.TZCheck->isChecked()) { + ui.startEdit->setTimeSpec(Qt::LocalTime); + ui.stopEdit->setTimeSpec(Qt::LocalTime); + } else { + ui.startEdit->setTimeSpec(Qt::UTC); + ui.stopEdit->setTimeSpec(Qt::UTC); + } + // Force update of Edit displays, so the displayed + // datetimes are in sync with the specified time spec. + auto ev = QEvent(QEvent::LocaleChange); + ui.startEdit->event(&ev); + ui.stopEdit->event(&ev); +} //------------------------------------------------------------------------ diff --git a/gui/filterwidgets.h b/gui/filterwidgets.h index 088ca0ae8..7de8ea1ec 100644 --- a/gui/filterwidgets.h +++ b/gui/filterwidgets.h @@ -23,15 +23,26 @@ #ifndef FILTERWIDGETS_H #define FILTERWIDGETS_H +#include // for QAbstractButton +#include // for QComboBox +#include // for QDateTime +#include // for QDateTimeEdit +#include // for QDoubleValidator +#include // for qMax, qMin +#include // for QLineEdit +#include // for QList +#include // for QObject, Q_OBJECT, slots +#include // for QSpinBox +#include // for QString +#include // for QWidget + +#include "filterdata.h" // for MiscFltFilterData, RtTrkFilterData, TrackFilterData, WayPtsFilterData +#include "ui_miscfltui.h" // for Ui_MiscFltWidget +#include "ui_rttrkui.h" // for Ui_RtTrkWidget +#include "ui_trackui.h" // for Ui_TrackWidget +#include "ui_wayptsui.h" // for Ui_WayPtsWidget -#include "ui_trackui.h" -#include "ui_wayptsui.h" -#include "ui_rttrkui.h" -#include "ui_miscfltui.h" -#include "filterdata.h" -class CheckEnabler; -class FilterOption; //------------------------------------------------------------------------ class CheckEnabler: public QObject { @@ -307,6 +318,7 @@ private slots: void splitDateX(); void splitTimeX(); void splitDistanceX(); + void TZX(); void packCheckX(); }; -- 2.30.2